package com.hxrfid.framework.handler;

import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.hxrfid.common.config.HxrfidConfig;
import com.hxrfid.common.context.SecurityContextHolder;
import com.hxrfid.common.helper.LoginHelper;
import com.hxrfid.common.utils.ServletUtils;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;


public class CommonTenantHandler implements TenantLineHandler {

    /**
     * 多租户系统数据表
     */
    private final HxrfidConfig.Tenant tenant;

    private final String defaultTenantId = "0000";

    /**
     * 多租户字段名称
     */
    private final String column;

    public CommonTenantHandler(HxrfidConfig.Tenant tenant) {
        this.tenant = tenant;
        this.column = tenant.getColumn();
    }

    /**
     * 获取租户ID
     *
     * @return 租户ID
     */
    @Override
    public Expression getTenantId() {
        try {
            return new LongValue(SecurityContextHolder.getTenantId());
        } catch (Exception e) {
            return new LongValue(this.defaultTenantId);
        }
    }

    /**
     * 获取租户字段名称
     *
     * @return 租户字段名称
     */
    @Override
    public String getTenantIdColumn() {
        return this.column;
    }

    /**
     * 过滤租户表
     *
     * @param tableName 表名
     * @return 是否进行过滤 true:表示忽略，false:需要解析并拼接多租户条件
     */
    @Override
    public boolean ignoreTable(String tableName) {
        if (ServletUtils.getRequestAttributes() != null) {
            try {
                if (null != LoginHelper.getLoginUser() && LoginHelper.isSuperUser()) {
                    return true;
                }
            } catch (Exception ignore) {
                ignore.printStackTrace();
            }
        }
        // 表名匹配
        if (tenant.getIgnoreTables().contains(tableName)) {
            return true;
        }
        // 前缀匹配
        for (String prefix : this.tenant.getPrefixs()) {
            if (tableName.startsWith(prefix)) {
                // 判断是否排除
                return !this.tenant.getPrefixsExclude().contains(tableName);
            }
        }
        return false;
    }
}
